﻿using System;
using System.Linq;

namespace WPFCustomTextboxControls.Time
{
    public class Zeitrechner
    {
        #region Member
        private DateTime _startzeit;
        private DateTime _endezeit;
        private int _pauseInMinuten;
        #endregion

        #region Properties
        /// <summary>
        /// Die Arbeitsstartzeit
        /// </summary>
        public DateTime Startzeit
        {
            get { return _startzeit; }
            set { _startzeit = value; }
        }

        /// <summary>
        /// Die Arbeitsendezeit
        /// </summary>
        public DateTime Endezeit
        {
            get { return _endezeit; }
            set { _endezeit = value; }
        }

        /// <summary>
        /// Die Anzahl der Pausenzeit in Minuten
        /// </summary>
        public int PauseInMinuten
        {
            get { return _pauseInMinuten; }
            set { _pauseInMinuten = value; }
        }
        #endregion

        #region Konstruktor
        /// <summary>
        /// Initialisieren des Zeitrechners mit Strings
        /// </summary>
        /// <param name="startzeit">Startzeit als String, z.B. 8:15 oder 8 für 8:00</param>
        /// <param name="endezeit">Endezeit als String, z.B. 12:01, wenn keine Endezeit angegeben wurde, dann wird der aktuelle Zeitpunkt für die Berechnung genommen.</param>
        /// <param name="pausenzeitInMinuten">Die Pausezeit in Minuten</param>
        public Zeitrechner(string startzeit, string endezeit, string pausenzeitInMinuten)
        {
            _pauseInMinuten = 0;
            if (pausenzeitInMinuten.Trim().Length > 0)
            {
                _pauseInMinuten = int.Parse(pausenzeitInMinuten);
            }

            _startzeit = SetDateTime(startzeit);

            //Wenn kein Wert für die Endezeit übergeben wurde, dann die aktuelle Uhrzeit nehmen.
            _endezeit = DateTime.Now;
            if (endezeit.Trim().Length > 0)
            {
                _endezeit = SetDateTime(endezeit);
            }
        }
        #endregion

        #region Functions/Subs
        /// <summary>
        /// Berechnet die aktuelle arbeitszeit in Stunden.
        /// </summary>
        /// <returns>Arbeitszeit in Stunden, bei einem Fehler Double.MinValue</returns>
        public double GetArbeitszeitInStunden()
        {
            TimeSpan tStartzeit = new TimeSpan(Startzeit.Hour, Startzeit.Minute, 0);
            TimeSpan tEndezeit = new TimeSpan(Endezeit.Hour, Endezeit.Minute, 0);

            TimeSpan tnewTimspan = tEndezeit.Subtract(tStartzeit);

            double tMinutes = tnewTimspan.TotalMinutes;

            if (tMinutes > 0)
            {
                return (tMinutes - PauseInMinuten) / 60;
            }

            return double.MinValue;
        }

        /// <summary>
        /// Erstellt aus einem übergebenen String die passende Uhrzeit
        /// </summary>
        /// <param name="uhrzeit">Die Uhrzeit als String, z.B. 8:15 oder 8</param>
        /// <returns>Datetime Objekt mit dem aktuellen Datum und der übergebenen Uhrzeit.</returns>
        private DateTime SetDateTime(string  uhrzeit)
        {
            int tStunde = 0;
            int tMinute = 0;

            //Die richtige Uhrzeit aus dem String parsen
            if (uhrzeit.Contains(':'))
            {
                try
                {
                    tStunde = int.Parse(uhrzeit.Split(':')[0]);
                    tMinute = int.Parse(uhrzeit.Split(':')[1]);
                }
                catch (Exception)
                {
                    throw new NotImplementedException("Bitte eine richtige Uhrzeit angeben");
                }
            }
            else
            {
                try
                {
                    //Den  String direkt als Stunde nehmen wenn keine ":" enthalten sind.
                    tStunde = int.Parse(uhrzeit);
                }
                catch (Exception)
                {
                    tStunde = 0;
                }
            }

            return new DateTime(DateTime.Now.Year, DateTime.Now.Month, DateTime.Now.Day, tStunde, tMinute, 0);
        }
        #endregion

    }
}
